# 导入相关的模块
from crewai import LLM, Agent, Task, Crew
from ddgs_tools import ddgs_text_search
from  markitdown_tools import markdown_convert

# 1.配置大模型参数---deepseek
def config_deepseek_llm():
    return LLM(
        model="deepseek/deepseek-chat",
        model_kwargs={"llm_provider": "deepseek"},
        api_key="sk-48c05c2ae3134a33b25f3ee94066c97b",
        base_url="https://api.deepseek.com/v1",
    )


# 2.创建智能体对象
# 创建和配置检索代理
retriever_agent = Agent(
    role="检索相关信息以回答⽤户查询: {query}",
    goal="从可⽤资源中检索与⽤户查询最相关的信息: {query}，始终优先使⽤pdf搜索⼯具。如果⽆法从pdf搜索⼯具中检索到信息，则尝试使⽤⽹络搜索⼯具。",
    backstory="你是⼀位细致⼊微的分析师，以敏锐的洞察⼒著称。你以理解⽤户查询: {query} 并从最合适的知识库中检索信息的能⼒⽽闻名。",
    llm=config_deepseek_llm(),
    verbose=True,  # 输出详细日志
    tools=[ddgs_text_search, markdown_convert],
)

# 创建和配置响应合成代理
response_synthesizer_agent = Agent(
    role="⽤户查询的响应合成器: {query}",
    goal="根据⽤户查询: {query} 将检索到的信息综合成简洁连贯的响应。如果⽆法检索到信息，则回应“抱歉，我找不到您要的信息。",
    backstory="你是⼀位熟练的沟通者，擅⻓将复杂的信息转化为清晰简洁的回应。",
    llm=config_deepseek_llm(),
    verbose=True,  # 输出详细日志
)

# 3.智能体任务的创建
# 定义和配置检索任务
retrieve_task = Task(
    description="从可⽤资源中检索与⽤户查询最相关的信息: {query}",  # 任务描述
    expected_output="以⽂本形式从资源中检索到的最相关信息。",  # 期望的输出
    agent=retriever_agent,  # 检索代理, 执行任务
)
response_task = Task(
    description="为⽤户查询合成最终响应: {query}",
    expected_output="基于从正确来源检索到的信息，为⽤户查询: {query} 提供简洁连贯的响应。如果⽆法检索到信息，则回应“抱歉，我找不到您要的信息。",
    agent=response_synthesizer_agent,  # 响应合成代理, 执行任务
)
# 4.创建Crew对象
crew = Crew(
    angents=[retriever_agent, response_synthesizer_agent],  # 添加代理
    tasks=[retrieve_task, response_task],  # 添加任务
    verbose=True,  # 输出详细日志
)
# 执⾏Crew任务并打印输出
crew_output = crew.kickoff(inputs={"query": "ORM查询的常用方法总结"})
print(crew_output)
